package com.ruoyi.system.service.impl.fxImpl;

import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.system.domain.fx.FxChina;
import com.ruoyi.system.mapper.fx.FxChinaMapper;
import com.ruoyi.system.service.fx.IFxChinaService;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 全国省市区经纬度Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-07-23
 */
@Service
public class FxChinaServiceImpl implements IFxChinaService
{
    @Autowired
    private FxChinaMapper fxChinaMapper;
    @Autowired
    private RedisCache redisCache;

    /**
     * 查询全国省市区经纬度
     * 
     * @param id 全国省市区经纬度主键
     * @return 全国省市区经纬度
     */
    @Override
    public FxChina selectFxChinaById(Long id)
    {
        return fxChinaMapper.selectFxChinaById(id);
    }

    /**
     * 查询全国省市区经纬度列表
     * 
     * @param fxChina 全国省市区经纬度
     * @return 全国省市区经纬度
     */
    @Override
    public List<FxChina> selectFxChinaList(FxChina fxChina)
    {
        return fxChinaMapper.selectFxChinaList(fxChina);
    }

    @Override
    public List<FxChina> listAll() {
        List<FxChina> chinaRedis = redisCache.getCacheList("chinaRedis");
        if (!ObjectUtils.isEmpty(chinaRedis)){
            return chinaRedis;
        }
        // 从数据库批量查询所有字典数据
        List<FxChina> allDictionaries = fxChinaMapper.selectFxChinaList(new FxChina());
        // 使用 Map 构建字典 ID 到字典对象的映射关系
        Map<Long, FxChina> dictionaryMap = new HashMap<>();
        //把所有的id存到map中，key是id  value是对应的对象
        for (FxChina dictionary : allDictionaries) {
            dictionaryMap.put(dictionary.getId(), dictionary);
        }
        // 构建字典树结构  新建一个对象集合
        List<FxChina> dictionaries = new ArrayList<>();
        //遍历所有集合
        for (FxChina dictionary : allDictionaries) {
            //* 获取每一个对象的父id
            Long parentId = dictionary.getParentId();

            if (parentId == 0) {
                //* 如果父id==0，将该对象添加的新的集合总
                dictionaries.add(dictionary);
            } else {
                //* 如果父id！=0 获取  获取父对象
                FxChina parent = dictionaryMap.get(parentId);
                if (parent != null) {
                    //* 如果父对象不为null  将遍历的这个对象添加到该父对象的子类中
                    parent.getChildren().add(dictionary);
                }
            }
        }
        // 递归添加子节点的子节点遍历所有的一级对象
        for (FxChina dictionary : dictionaries) {
            setChildrenRecursive(dictionary, dictionaryMap);
        }
        List<FxChina> children = dictionaries.get(0).getChildren();
        redisCache.setCacheList("chinaRedis",children);
        return children;
    }

    private void setChildrenRecursive(FxChina parent, Map<Long, FxChina> dictionaryMap) {
        //获取一级对象的二级集合
        List<FxChina> children = parent.getChildren();
        //遍历二级集合
        for (FxChina child : children) {
            //获取二级对象
            FxChina childFromMap = dictionaryMap.get(child.getId());
            if (childFromMap != null) {
                // 如果二级对象不为空   则把三级对象设置给二级对象的Children
                child.setChildren(childFromMap.getChildren());
                setChildrenRecursive(child, dictionaryMap);
            }
        }
    }

    /**
     * 查询区域名称
     * @param ids
     * @return
     */
    @Override
    public String selectRegionNameByIds(Long[] ids) {
        return fxChinaMapper.selectRegionNameByIds(ids);
    }

    /**
     * 新增全国省市区经纬度
     * 
     * @param fxChina 全国省市区经纬度
     * @return 结果
     */
    @Override
    public int insertFxChina(FxChina fxChina)
    {
        return fxChinaMapper.insertFxChina(fxChina);
    }

    /**
     * 修改全国省市区经纬度
     * 
     * @param fxChina 全国省市区经纬度
     * @return 结果
     */
    @Override
    public int updateFxChina(FxChina fxChina)
    {
        return fxChinaMapper.updateFxChina(fxChina);
    }

    /**
     * 批量删除全国省市区经纬度
     * 
     * @param ids 需要删除的全国省市区经纬度主键
     * @return 结果
     */
    @Override
    public int deleteFxChinaByIds(Long[] ids)
    {
        return fxChinaMapper.deleteFxChinaByIds(ids);
    }

    /**
     * 删除全国省市区经纬度信息
     * 
     * @param id 全国省市区经纬度主键
     * @return 结果
     */
    @Override
    public int deleteFxChinaById(Long id)
    {
        return fxChinaMapper.deleteFxChinaById(id);
    }
}
